[アップデート] Amazon S3 の ls コマンドにバケットリージョンとバケットプレフィックスを指定するオプションが追加されました

[アップデート] Amazon S3 の ls コマンドにバケットリージョンとバケットプレフィックスを指定するオプションが追加されました

Clock Icon2025.01.08

いわさです。

AWS CLI を使って S3 バケットを操作することが出来るのですが、S3 コマンドには High-Level と Low-Level という異なる階層のコマンドが提供されています。
aws s3が High-Level コマンド、aws s3apiは Low-Level コマンドとなっており、前者は S3 に関する基本的なタスクを簡単に実行するために用意されているコマンドで、後者は S3 API のすべてのオペレーション(High-Level で公開されていない API やオプション)にアクセスが出来るコマンドです。

両者で何ができて何ができないのか、以下の記事で比較されておりわかりやすいと思います。
雑に言うとは基本的な S3 の操作であればaws s3で足りるしサッと使えるんだけど、ちょっと難しいことやろうとするとそれだと出来ないので、aws s3apiをリファレンス見ながら使おうね。という感じです。

https://dev.classmethod.jp/articles/cli-command-s3-s3-and-s3api-i-tried-to-find-out-what-i-can-do/

そんな High-Level のs3コマンドですが、これまでs3apiでのみ使えた一部のオプションが使えるようになりました。
AWS CLI の 1.36.35 で導入されたようで、具体的にはs3 lsコマンドで--bucket-name-prefix--bucket-regionが使えるようになりました。

https://github.com/aws/aws-cli/commit/13482b1cccf92b3c5476b11a8070652431242d34#diff-7fd9ff7e101207961be573485ff2e1b5b60368bbf936df7815de49adce29834eR19

バージョン確認

そうか。お前使えなかったんか。という感じもしますが、まずはバージョンアップ前のヘルプを見てみます。

% aws --version
aws-cli/2.22.7 Python/3.12.6 Darwin/23.6.0 exe/x86_64

NAME
       ls -

DESCRIPTION
       List S3 objects and common prefixes under a prefix or all S3 buckets.
       Note that the --output and --no-paginate arguments are ignored for this
       command.

SYNOPSIS

            ls
          <S3Uri> or NONE
          [--recursive]
          [--page-size <value>]
          [--human-readable]
          [--summarize]
          [--request-payer <value>]
          [--debug]
          [--endpoint-url <value>]
          [--no-verify-ssl]
          [--no-paginate]
          [--output <value>]
          [--query <value>]
          [--profile <value>]
          [--region <value>]
          [--version <value>]
          [--color <value>]
          [--no-sign-request]
          [--ca-bundle <value>]
          [--cli-read-timeout <value>]
          [--cli-connect-timeout <value>]
          [--cli-binary-format <value>]
          [--no-cli-pager]
          [--cli-auto-prompt]
          [--no-cli-auto-prompt]

たしかに、指定出来そうなオプションがないですね。
ではバージョンアップ後も同じように確認してみましょう。

NAME
       ls -

DESCRIPTION
       List S3 objects and common prefixes under a prefix or all S3 buckets.
       Note that the --output and --no-paginate arguments are ignored for this
       command.

SYNOPSIS

            ls
          <S3Uri> or NONE
          [--recursive]
          [--page-size <value>]
          [--human-readable]
          [--summarize]
          [--request-payer <value>]
          [--bucket-name-prefix <value>]
          [--bucket-region <value>]
          [--debug]

:

なるほど、追加されています。
この 2 つのコマンドは内部的にはs3api list-bucketsコマンドの--prefix--bucket-regionパラメータと同じ挙動となっているようです。
使ってみますか。

bucket-region オプション

まずは普通のs3 lsです。当然ながら全リージョンのバケットが出力されるのですが、検索対象のバケットリージョンを指定できます。

% aws s3 ls --bucket-region ap-northeast-1
2024-12-31 05:20:17 amplify-amplifyvitereactt-amplifydataamplifycodege-hrwnvnltxy1o
2024-12-25 13:58:05 amplify-classmethodgameda-amplifydataamplifycodege-25t9zxrau9o3
2024-11-08 06:31:00 amplify-d1e3wqqe5zr0h5-ho-amplifydataamplifycodege-k7pktzukjlrq
2024-11-09 11:16:17 amplify-d1e3wqqe5zr0h5-ma-amplifydataamplifycodege-04jl1fa7rtg1

:

2024-11-14 07:29:02 terraform-state-123456789012
2024-11-21 08:01:28 viteproject31f4192f6a434afa82f014082eb4f45b17fe4-dev

オプションなしと比較してみます。おそらく東京リージョン以外のバケットが 19 件あるみたいです。

% aws s3 ls --bucket-region ap-northeast-1 | wc -l
     162
% aws s3 ls | wc -l                               
     181

ちなみにこのオプションを使うとリージョナルエンドポイントにアクセスする形になるようです。
なので、グローバルオプションのリージョンと合わせる必要があるみたいです。(私のプロファイルはデフォルトが東京リージョン)

% aws s3 ls --bucket-region us-east-1             

An error occurred (InvalidArgument) when calling the ListBuckets operation: Requests with bucket-region specified must be made to the corresponding regional endpoint
% aws s3 ls --bucket-region us-east-1 --region us-east-1
2023-05-03 06:44:56 aws-athena-query-results-123456789012-us-east-1
2023-03-02 18:50:13 aws-sam-cli-managed-default-samclisourcebucket-c816u3vzg9j
2023-04-04 09:24:43 aws-supply-chain-accesslogsc2cc22fa-d532-49ef-aceb-f4085956d346
2023-04-04 09:24:43 aws-supply-chain-data-c2cc22fa-d532-49ef-aceb-f4085956d346
2021-11-03 20:49:22 cf-templates-1nzt35y956ufp-us-east-1
2022-08-14 05:54:05 cw-syn-results-123456789012-us-east-1
2022-01-26 14:52:44 efs-web-efsfilewebapplication-16yfs6i1smd6h-website
2021-12-27 14:13:47 hoge-chime-stack-chatattachmentsbucket-l55n14a2ke1t
2024-08-03 10:49:32 hoge0803modelcustom
2023-01-17 13:42:28 microserviceextractorfordotnet
2022-01-12 16:36:39 rain-artifacts-123456789012-us-east-1

念の為見え方の違いを確認しますが、s3api list-bucketsだと次のような感じです。
冒頭の記事で比較されているように日付が UTC だったり、出力形式が JSON だったりですね。

% aws s3api list-buckets --bucket-region ap-northeast-1
{
    "Buckets": [
        {
            "Name": "amplify-amplifyvitereactt-amplifydataamplifycodege-hrwnvnltxy1o",
            "CreationDate": "2024-12-30T20:20:17+00:00",
            "BucketRegion": "ap-northeast-1"
        },
        {
            "Name": "amplify-classmethodgameda-amplifydataamplifycodege-25t9zxrau9o3",
            "CreationDate": "2024-12-25T04:58:05+00:00",
            "BucketRegion": "ap-northeast-1"
        },

:

bucket-name-prefix オプション

続いてbucket-name-prefixオプションも確認してみます。
バケット名のプレフィックスを指定出来る感じですね。私はよく検証用のバケットを「hoge」から始めることがあるので、それだけ抽出してみます。

% aws s3 ls --bucket-name-prefix hoge
2024-11-13 15:13:11 hoge-athena-queri-result
2021-12-27 14:13:48 hoge-chime-stack-chatattachmentsbucket-l55n14a2ke1t
2024-11-21 06:21:31 hoge-iwasa-fis-lambda
2024-11-10 06:56:16 hoge0108resourcelist
2024-11-10 06:56:16 hoge0108userlist
2024-11-13 15:13:12 hoge0109array
2024-11-13 15:13:12 hoge0109resourcelist
2024-11-10 06:56:16 hoge0109tmp
2024-11-13 15:13:12 hoge0109userlist
2024-11-13 15:13:12 hoge0123backup
2024-11-21 06:21:31 hoge0201qs
2024-11-13 15:13:12 hoge0208datasync1
2024-11-13 15:13:12 hoge0208datasync2

:

2024-11-13 15:13:15 hogepipeline-pipelineartifactsloggingbucket-1m2b97z4dhoyb
2024-11-10 06:56:18 hogepipeline-pipelineartifactsloggingbucket-3n0qlkhb3smi
2024-11-13 15:13:15 hogepipeline-pipelineartifactsloggingbucket-6ahxl4lu98s3
2024-11-10 06:56:18 hogesesreceive
2024-11-13 15:13:15 hogestoragelensexport

hoge から始まるバケットだけが抽出されましたね。
ちなみにこちらs3api list-bucketsだとこうなります。

% aws s3api list-buckets --prefix hoge
{
    "Buckets": [
        {
            "Name": "hoge-athena-queri-result",
            "CreationDate": "2024-11-13T06:13:11+00:00",
            "BucketRegion": "ap-northeast-1"
        },
        {
            "Name": "hoge-chime-stack-chatattachmentsbucket-l55n14a2ke1t",
            "CreationDate": "2021-12-27T05:13:48+00:00",
            "BucketRegion": "us-east-1"
        },
:

さいごに

本日は High-Level S3 の ls コマンドにバケットリージョンとバケットプレフィックスを指定するオプションが追加されたので試してみました。

私は普段よくs3apiを使うので、いままでこのオプション指定できなかったのかとちょっと驚きました。地味に嬉しいアップデートなのではないでしょうか。
s3 lsをよくお使いの方は今回のオプション使ってみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.